package script

import (
	"fmt"
	"huijing_mall/internal/cachebase"
	"huijing_mall/internal/database"
	"huijing_mall/shared/common"
	"huijing_mall/shared/get_ctx_value"
	"huijing_mall/variable"
	"time"

	"huijing_mall/pkg/logger"

	"github.com/robfig/cron/v3"
)

type CronObj struct {
	CronCtx *cron.Cron
	DBS     *get_ctx_value.DBS
}

// 定时任务
func (c *CronObj) SetTimeTask() {
	t := time.Now()                                                         // 获取当前时间
	logger.Info(common.StrPinJie("当前时间：", t.Format("2006-01-02 15:04:05"))) // 格式化时间输出
	// 添加一个每两分钟执行一次的定时任务
	//addFunc, err := c.CronCtx.AddFunc("*/1 * * * *", func() {
	//	c.Log.Info(fmt.Sprintf("定时任务执行：", time.Now().Format("2006-01-02 15:04:05")))
	//})
	// 添加一个每两分钟执行一次的定时任务
	//addFunc1, err := c.CronCtx.AddFunc("*/1 * * * *", func() {
	//	logger.Info("第一个定时任务.接到任务,开始处理")
	//	// 逐个获取有序集合中的元素
	//	var start int64 = 0
	//	for {
	//		value, nextStart, err := cachebase.GetNextElement(c.DBS.Rdb, variable.My_zset, start)
	//		if err != nil {
	//			if err.Error() == "no more elements" {
	//				logger.Error(err.Error())
	//				kernel.ErrChan <- *kernel.ErrOther("All elements have been retrieved.")
	//				break
	//			}
	//			logger.Error(err.Error())
	//			fmt.Println(fmt.Sprintf("Failed to get next element:%v", err))
	//			return
	//		}
	//		fmt.Println(fmt.Sprintf("Retrieved element: %s\n", value))
	//		err = cachebase.RemoveFromZSet(c.DBS.Rdb, variable.My_zset, value)
	//		if err != nil {
	//			logger.Error(err.Error())
	//			kernel.ErrChan <- *kernel.ErrOther("cachebase remove key filed")
	//			break
	//		}
	//		var cb ask.CityDBRequest
	//		sonic.Unmarshal([]byte(value), &cb)
	//		_, _, _ = collectlogic.FindOne(c.DBS, cb)
	//		start = nextStart
	//	}
	//})
	addFunc2, err := c.CronCtx.AddFunc("0 0 * * *", func() {
		logger.Info("第二个定时任务.接到任务,开始处理")
		logger.Info("第二个定时任务.接到任务,处理中...")
		for {
			if cachebase.RedisExist(c.DBS.Rdb, variable.PwdCount) {
				logger.Info("存在：" + variable.PwdCount)
				//一个一个 取
				key, err1 := cachebase.LGetList(c.DBS.Rdb, variable.PwdCount)
				if err1 != nil {
					logger.Error(err1.Error())
					break
				}
				logger.Info(fmt.Sprintf("取出数据：%v", key))
				//一个一个 删
				if !cachebase.RedisDel(c.DBS.Rdb, key) {
					logger.Error("删除失败")
				}
				logger.Error("删除成功")
			}
			if cachebase.RedisExist(c.DBS.Rdb, string(variable.CountKey)) {
				logger.Info("存在：" + string(variable.CountKey))
				//一个一个 取
				key, err1 := cachebase.LGetList(c.DBS.Rdb, string(variable.CountKey))
				if err1 != nil {
					logger.Error(err1.Error())
					break
				}
				logger.Info(fmt.Sprintf("取出数据：%v", key))
				//一个一个 删
				if !cachebase.RedisDel(c.DBS.Rdb, key) {
					logger.Error("删除失败")
				}
				logger.Info("删除成功")
			} else {
				break
			}

		}
		logger.Info("第二个定时任务.接到任务,处理成功")
	})
	addFunc3, err := c.CronCtx.AddFunc("0 0 * * *", func() {
		logger.Info("第三个定时任务.接到任务,开始处理")
		//增加一个刷新 key
		all, err1 := database.GetUserAll(c.DBS.DB)
		if err1 != nil {
			logger.Error(err.Error())
			return
		}
		logger.Info("第三个定时任务.接到任务,处理中...")
		for _, user := range all {
			user.RegisterDays += 1
			err = database.UpdateDC(c.DBS.DB, user.BaseModel.ID, user.RegisterDays)
			if err != nil {
				logger.Error(err.Error())
				return
			}
		}
		logger.Info("第三个定时任务.接到任务,处理完成")
		return
	})
	if err != nil {
		logger.Error(err.Error())
		return
	}
	//fmt.Println("定时任务添加成功，标识：", addFunc)
	//logger.Info(fmt.Sprintf("定时任务添加成功，标识：%v", addFunc1))
	logger.Info(fmt.Sprintf("定时任务添加成功，标识：%v", addFunc2))
	logger.Info(fmt.Sprintf("定时任务添加成功，标识：%v", addFunc3))

	c.CronCtx.Start() // 启动 cron 调度器

	//select {} // 阻塞主 goroutine，以保持程序运行
}
